/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package servlet;

import ejb.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author drocco
 */
@WebServlet(name = "SuperPointCartServlet", urlPatterns = {"/SuperPointCartServlet"})
public class ServletMain extends HttpServlet {

    @EJB
    private GestoreClienteLocal gestoreCliente;
    @EJB
    private GestoreCassiereLocal gestoreCassiere;
    @EJB
    private GestoreCampagnaRaccoltaPuntiLocal gestoreCampagnaRaccoltaPunti;
    @EJB
    private GestoreEsercizioCommercialeLocal gestoreEsercizioCommerciale;
    @EJB
    private GestorePremioLocal gestorePremio;
    @EJB
    private GestoreRaccoltaPuntiDelClienteLocal gestoreRaccoltaPuntiDelCliente;

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, ParseException {

        //testing only: will be removed
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        //validazione input
        //check sessione
        HttpSession session = request.getSession(true);
        //esecuzione operazione e dispatching
        String op = request.getParameter("op");
        if (op == null) {
            forward(request, response, "/index.jsp");
        } else if ("register".equals(op)) {//registrazione
            String usr = request.getParameter("username");
            String pwd = request.getParameter("password");
            String fst = request.getParameter("nome");
            String snd = request.getParameter("cognome");
            char sex = request.getParameter("sesso").charAt(0);
            gestoreCliente.addCliente(usr, pwd, fst, snd, sex, new Date(), usr);

            out.println("<h2>servlet</h2>");
            out.println("Dopo qualche controllo...<br/>");
            out.println(fst + " " + snd + ", sei stato schedato!<br/>");

            out.println("<a href=\"index.jsp\">&lt; Home Page</a>");

            //forward(request,response,"/login.jsp");
            /*
             * u = new Utente(request.getParameter("account")); if (u==null ||
             * !u.checkPassword(request.getParameter("password")))
             * forward(request,response,"/login.jsp"); else {
             * session.setAttribute("user",u);
             * forward(request,response,"/home.jsp"); }
             */
        } //login
        else if ("login".equals(op)) {
            //check login
            String usr = request.getParameter("username");
            String pwd = request.getParameter("password");
            Cliente cliente = gestoreCliente.findClienteByUserNameAndPassword(usr, pwd);
            if (cliente != null) {
                out.println("nome utente: " + cliente.getUserName() + "<br/>");
                out.println("password: " + cliente.getPassword() + "<br/>");
                out.println("nome: " + cliente.getNome() + "<br/>");
                out.println("cognome: " + cliente.getCognome() + "<br/>");
                out.println("sesso: " + cliente.getSesso() + "<br/>");
                out.println("data di nascita: " + cliente.getDataDiNascita() + "<br/>");
                session.setAttribute("cliente", cliente);
                
                forward(request, response, "/home_utente.jsp");

            } else {
                out.println("non esisti!<br/>");
            }

            out.println("<a href=\"index.jsp\">&lt; Home Page</a>");

            //forward(request,response,"/login.jsp");
            /*
             * u = new Utente(request.getParameter("account")); if (u==null ||
             * !u.checkPassword(request.getParameter("password")))
             * forward(request,response,"/login.jsp"); else {
             * session.setAttribute("user",u);
             * forward(request,response,"/home.jsp"); }
             */
        } //visualizza raccolta punti
        else if ("visualizzaRaccoltaPunti".equals(op)) {
            //parametri: idRaccoltaPunti
            out.println("op: " + op);
        } //visualizza raccolta punti
        else if ("visualizzaPremio".equals(op)) {
            //parametri: idEsercizioCommerciale, idPremio
            out.println("op: " + op);
        } else if ("registerEsercizioCommerciale".equals(op)) {
            String usr = request.getParameter("username");
            String pwd = request.getParameter("password");
            String telefono = request.getParameter("telefono");
            String indirizzo = request.getParameter("indirizzo");
            String email = request.getParameter("email");
            EsercizioCommerciale e = gestoreEsercizioCommerciale.createEsercizioCommerciale(usr, pwd, telefono, email, indirizzo);
            gestoreCampagnaRaccoltaPunti.creaCampagnaRaccoltaPunti(new Date(System.currentTimeMillis()), new Date(1000000 + System.currentTimeMillis()), e, null);
            out.println("registro esercizio commerciale " + e);
        } else if ("visualizzaEsercizioCommerciale".equals(op)) {
            String usr = request.getParameter("username");
            String pwd = request.getParameter("password");
            EsercizioCommerciale e = gestoreEsercizioCommerciale.findEsercizioCommerciale(usr, pwd);
            out.println("user name:" + e.getUserName() + "<br/>");
            out.println("telefono: " + e.getTelefono() + "<br/>");
            out.println("email: " + e.getRecapitoMail() + "<br/>");
            for (CampagnaRaccoltaPunti campagna : e.getCampagnaRaccoltaPuntiList()) {
                out.println("CAMPAGNA " + campagna.getId() + "<br/>");
                out.println("data inizio: " + campagna.getDataInizio() + "<br/>");
                out.println("data fine: " + campagna.getDataFine() + "<br/>");

            }
        } else if ("aggiungiRaccoltaPunti".equals(op)) {
            String usr = request.getParameter("username");
            String pwd = request.getParameter("password");
            String dataInizio = request.getParameter("dataInizio");
            String dataFine = request.getParameter("dataFine");
            DateFormat formatter;
            formatter = new SimpleDateFormat("dd/MM/yyyy");
            EsercizioCommerciale e = gestoreEsercizioCommerciale.findEsercizioCommerciale(usr, pwd);
            gestoreCampagnaRaccoltaPunti.creaCampagnaRaccoltaPunti((Date) formatter.parse(dataInizio), (Date) formatter.parse(dataFine), e, null);
            out.println("raccolta punti aggiunta!");

        } else if ("iscrizioneRaccoltaPunti".equals(op)) {
            String codiceBarre = request.getParameter("codiceBarre");
            String esercizioCommerciale = request.getParameter("esercizioCommerciale");
            String numeroPunti = request.getParameter("numeroPunti");
            gestoreCassiere.aggiornaRaccoltaPunti(codiceBarre, esercizioCommerciale, new Integer(numeroPunti));

        } else if ("aggiungiPremi".equals(op)) {
            String user = request.getParameter("user");
            String password = request.getParameter("password");
            String numeroPunti = request.getParameter("numeroPunti");
            String descrizione = request.getParameter("descrizione");
            EsercizioCommerciale e = gestoreEsercizioCommerciale.findEsercizioCommerciale(user, password);
            gestoreEsercizioCommerciale.aggiungiPremio(e, descrizione, new Long(numeroPunti));

        } else if ("logout".equals(op)) {
            session.invalidate();

            forward(request, response, "/home_utente.jsp");
        } else if ("loginCassa".equals(op)) {
            String usr = request.getParameter("username");
            String pwd = request.getParameter("password");
            Cassiere cassa = gestoreCassiere.getCassiere(usr, pwd);
            session.setAttribute("cassa", cassa);
            forward(request, response, "/cassa.jsp");

        } else if("loginCodiceABarre".equals(op)){
            String codiceBarre=request.getParameter("codiceABarre");
            Cliente cliente=gestoreCassiere.CercaClientePerCodiceBarre(codiceBarre);
            session.setAttribute("cliente", cliente);
            forward(request, response, "/cassa.jsp");
        }else if("nuovoClienteAllaCassa".equals(op)){
            session.removeAttribute("cliente");
           forward(request, response, "/cassa.jsp");
        }else if("aggiungiPunti".equals(op)){
            Cliente cliente=(Cliente)session.getAttribute("cliente");
            Cassiere cassa=(Cassiere)session.getAttribute("cassa");
            int punti= new Integer(request.getParameter("punti"));
            gestoreCassiere.aggiornaRaccoltaPunti(cliente.getCodiceBarre(), cassa.getEsercizioCommerciale().getUserName(), punti);
            forward(request, response, "/cassa.jsp");
        }else if("showRaccoltaPunti".equals(op)){
            int raccoltaPuntiId=new Integer(request.getParameter("raccoltaPuntiId"));
            Cliente cliente=(Cliente)session.getAttribute("cliente");
            RaccoltaPuntiDelCliente raccoltaPuntiDelCliente=gestoreRaccoltaPuntiDelCliente.getRaccoltaPuntiDelCliente(cliente, raccoltaPuntiId);
            session.setAttribute("raccoltaPuntiDelCliente", raccoltaPuntiDelCliente);
            session.setAttribute("cliente", cliente);
            Premio prossimoPremio=gestoreCampagnaRaccoltaPunti.cercaProssimoPremio(raccoltaPuntiDelCliente);
            session.setAttribute("prossimoPremio",prossimoPremio);
            forward(request, response, "/raccolta.jsp");
        }else{
            forward(request, response, "/error.jsp");
        }
        out.close();
        return;
    }

    private void forward(HttpServletRequest request, HttpServletResponse response, String page)
            throws ServletException, IOException {
        ServletContext sc = getServletContext();
        RequestDispatcher rd = sc.getRequestDispatcher(page);
        rd.forward(request, response);
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (ParseException ex) {
            Logger.getLogger(ServletMain.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (ParseException ex) {
            Logger.getLogger(ServletMain.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
